package com.zhiyou100.test.test04.proxy;

/**
 * 1 定义接口
 */
interface Person {
    /**
     * 展示方法
     */
    void show();

    /**
     * 吃饭方法
     *
     * @param food
     */
    void eat(String food);

    /**
     * 默认方法
     */
    default void hello() {
        System.out.println("我是一个默认方法！！！！");
    }
}

/**
 * @author yang
 * @className Demo01
 * @packageName com.zhiyou100.test.test04.proxy
 * @Description TODO 代理 测试1
 * @date 2020-08-11 09:17
 */
public class Demo01 {
    /**
     * 静态代理
     */

    public static void main(String[] args) {

        // 创建被代理对象
        final Student student = new Student("含么咩", "java26");
        // 创建代理对象
        final StudentProxy studentProxy = new StudentProxy();
        // 代理对象和和被代理对象关联
        studentProxy.student = student;

        // 使用时，使用代理对象来调用被代理对象
        studentProxy.show();
        studentProxy.eat("汉堡包");
    }

}

/**
 * 2 创建被代理对象
 */
class Student implements Person {

    String sname;
    String sclass;

    public Student(String sname, String sclass) {
        this.sname = sname;
        this.sclass = sclass;
    }

    @Override
    public void show() {
        System.out.println("我是 " + sclass + " 班的学生 我的名字 " + sname);
    }

    @Override
    public void eat(String food) {
        System.out.println("学生" + sname + "正在吃饭 " + food);
    }
}

/**
 * 3 创建代理类，来代理 Student ，对其功能进行扩展
 */
class StudentProxy implements Person {

    /**
     * 定义一个接口类型的引用，
     * 记录被代理对象
     */
    Person student;


    @Override
    public void show() {
        student.show();
        System.out.println(" 唱首歌");
    }

    @Override
    public void eat(String food) {
        student.eat(food);
        System.out.println(" 注意，粒粒皆辛苦");
    }


}